package com.chaos.eurekaproducer.redis;

import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;

import java.io.IOException;

/**
 * @author liaopeng
 * @title: CurrentLimiting
 * @projectName eureka-producer
 * @description: 简单限流
 * @date 2022/2/20下午5:18
 */
public class CurrentLimiting {

    private Jedis jedis;

    public CurrentLimiting(Jedis jedis) {
        this.jedis = jedis;
    }

/**-------------------------------------使用redis实现限流-------------------------------------------------------------*/
    /**
     *  指定用户userId的某个行为actionKey在特定时间period内最大允许发生的次数为maxCount
     * @param userId 用户id
     * @param actionKey 用户行为
     * @param period 限定时间
     * @param maxCount 最大次数
     */
    public boolean currentLimit(String userId,String actionKey,int period,int maxCount){
        String key = userId + "_" + actionKey;
        long nowTimes = System.currentTimeMillis();
        //score和value都是当前时间戳
        jedis.zadd(key,nowTimes,nowTimes+"");
        //按照score排序，并移除start，到end(包括)之间的元素
        jedis.zremrangeByScore(key,0,nowTimes-period*1000);
        //时间窗口内的元素数
        Long count = jedis.zcard(key);
        //过期时间应该等于时间窗口的长度，再多宽限1s
        jedis.expire(key,period + 1);
        return count <= maxCount;
    }


}
